package cn.jhh.content.utils;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.sql.Types;
import java.util.Collections;

/**
 * MyBatis-Plus代码生成器工具类
 */
public class CodeGenerator {

    /**
     * 数据库连接URL
     */
    private static final String URL = "jdbc:mysql://107.172.204.92:3306/content_prod?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";
    
    /**
     * 数据库用户名
     */
    private static final String USERNAME = "root";
    
    /**
     * 数据库密码
     */
    private static final String PASSWORD = "rootpassword";
    
    /**
     * 父包名
     */
    private static final String PARENT_PACKAGE = "cn.jhh.content";
    
    /**
     * 生成代码的模块路径
     */
    private static final String MODULE_PATH = System.getProperty("user.dir") + "/course-plus-content";

    /**
     * 执行代码生成
     */
    public static void main(String[] args) {
        FastAutoGenerator.create(URL, USERNAME, PASSWORD)
            // 全局配置
            .globalConfig(builder -> {
                builder.author("jhh") // 设置作者
                      .fileOverride() // 覆盖已生成文件
                      .outputDir(MODULE_PATH + "/src/main/java") // 指定输出目录
                      .commentDate("yyyy-MM-dd") // 注释日期
                      .disableOpenDir(); // 禁止打开输出目录
            })
            // 包配置
            .packageConfig(builder -> {
                builder.parent(PARENT_PACKAGE) // 设置父包名
                      .entity("model.entity") // 实体类包名
                      .service("service") // Service包名
                      .serviceImpl("service.impl") // ServiceImpl包名
                      .mapper("mapper") // Mapper包名
                      .controller("controller") // Controller包名
                      .pathInfo(Collections.singletonMap(OutputFile.xml, MODULE_PATH + "/src/main/resources/mapper")); // 设置mapperXml生成路径
            })
            // 策略配置
            .strategyConfig(builder -> {
                builder.addInclude("course_category") // 设置需要生成的表名，可以写多个，逗号分隔
                      .addTablePrefix("t_") // 设置过滤表前缀
                      // Entity策略配置
                      .entityBuilder()
                      .enableLombok() // 开启lombok
                      .enableTableFieldAnnotation() // 开启生成实体时生成字段注解
                      .logicDeleteColumnName("is_deleted") // 逻辑删除字段名(数据库)
                      .enableFileOverride() // 允许文件覆盖
                      
                      // Controller策略配置
                      .controllerBuilder()
                      .enableRestStyle() // 开启生成@RestController控制器
                      .enableHyphenStyle() // 开启驼峰转连字符
                      .enableFileOverride() // 允许文件覆盖
                      
                      // Service策略配置
                      .serviceBuilder()
                      .formatServiceFileName("%sService") // 设置service接口名
                      .formatServiceImplFileName("%sServiceImpl") // 设置service实现类名
                      .enableFileOverride() // 允许文件覆盖
                      
                      // Mapper策略配置
                      .mapperBuilder()
                      .enableMapperAnnotation() // 开启 @Mapper 注解
                      .enableBaseResultMap() // 启用BaseResultMap生成
                      .enableBaseColumnList() // 启用BaseColumnList
                      .enableFileOverride(); // 允许文件覆盖
            })
            .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板，默认的是Velocity引擎模板
            .execute(); // 执行
    }
} 